/**
 * @author Roger Wu
 */
(function($) {
	$.extend($.fn, {
				jBlindUp : function(options) {
					var op = $.extend({
								duration : 500,
								easing : "swing",
								call : function() {
								}
							}, options);
					return this.each(function() {
								var $this = $(this);
								$(this).animate({
											height : 0
										}, {
											step : function() {
											},
											duration : op.duration,
											easing : op.easing,
											complete : function() {
												$this.css({
															display : "none"
														});
												op.call();
											}
										});
							});
				},
				jBlindDown : function(options) {
					var op = $.extend({
								to : 0,
								duration : 500,
								easing : "swing",
								call : function() {
								}
							}, options);
					return this.each(function() {
								var $this = $(this);
								var fixedPanelHeight = (op.to > 0)
										? op.to
										: $.effect.getDimensions($this[0]).height;
								$this.animate({
											height : fixedPanelHeight
										}, {
											step : function() {
											},
											duration : op.duration,
											easing : op.easing,
											complete : function() {
												$this.css({
															display : ""
														});
												op.call();
											}
										});
							});
				},
				jSlideUp : function(options) {
					var op = $.extend({
								to : 0,
								duration : 500,
								easing : "swing",
								call : function() {
								}
							}, options);
					return this.each(function() {
								var $this = $(this);
								$this.wrapInner("<div></div>");
								var fixedHeight = (op.to > 0)
										? op.to
										: $.effect.getDimensions($(">div",
												$this)[0]).height;
								$this.css({
											overflow : "visible",
											position : "relative"
										});
								$(">div", $this).css({
											position : "relative"
										}).animate({
											top : -fixedHeight
										}, {
											easing : op.easing,
											duration : op.duration,
											complete : function() {
												$this.html($(this).html());
											}
										});

							});
				},
				jSlideDown : function(options) {
					var op = $.extend({
								to : 0,
								duration : 500,
								easing : "swing",
								call : function() {
								}
							}, options);
					return this.each(function() {
								var $this = $(this);
								var fixedHeight = (op.to > 0)
										? op.to
										: $.effect.getDimensions($this[0]).height;
								$this.wrapInner("<div style=\"top:-"
										+ fixedHeight + "px;\"></div>");
								$this.css({
											overflow : "visible",
											position : "relative",
											height : "0px"
										}).animate({
											height : fixedHeight
										}, {
											duration : op.duration,
											easing : op.easing,
											complete : function() {
												$this.css({
															display : "",
															overflow : ""
														});
												op.call();
											}
										});
								$(">div", $this).css({
											position : "relative"
										}).animate({
											top : 0
										}, {
											easing : op.easing,
											duration : op.duration,
											complete : function() {
												$this.html($(this).html());
											}
										});
							});
				}
			});
	$.effect = {
		getDimensions : function(element, displayElement) {
			var dimensions = new $.effect.Rectangle;
			var displayOrig = $(element).css('display');
			var visibilityOrig = $(element).css('visibility');
			var isZero = $(element).height() == 0 ? true : false;
			if ($(element).is(":hidden")) {
				$(element).css({
							visibility : 'hidden',
							display : 'block'
						});
				if (isZero)
					$(element).css("height", "");
				if ($.browser.opera)
					refElement.focus();
			}
			dimensions.height = $(element).outerHeight();
			dimensions.width = $(element).outerWidth();
			if (displayOrig == 'none') {
				$(element).css({
							visibility : visibilityOrig,
							display : 'none'
						});
				if (isZero)
					if (isZero)
						$(element).css("height", "0px");
			}
			return dimensions;
		}
	}
	$.effect.Rectangle = function() {
		this.width = 0;
		this.height = 0;
		this.unit = "px";
	}
})(jQuery);
